﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace mrp16062010.Uretec
{
    class SiparisUret
    {
        private static SiparisUret nesne;
        private static object syncRoot = new Object();

        private SiparisUret()
        {
            SiparisTeslimSuresi = Ayarlar.Nesne.TeslimAraligi;
        }

        public static SiparisUret Nesne
        {
            get
            {
                if (nesne == null)
                {
                    lock (syncRoot)
                    {
                        if (nesne == null)
                            nesne = new SiparisUret();
                    }
                }
                return nesne;
            }
        }

        private int siparisNo;
        public int SiparisNo
        {
            get
            {
                if (siparisNo == 0)
                {
                    siparisNo = 1;
                }
                siparisNo++;
                return siparisNo;
            }
        }
        

        public Aralik GunlukSiparisSayisi { get; set; }
        public Aralik SiparisTeslimSuresi { get; set; }
        public Aralik SiparisBuyuklugu { get; set; } 
        //AnaTarihler = Tüm tarih aralığı
        //GunlukTarih = Günün başlangıç ve bitiş tarihi
        //Parçalar = Rotaları belli olan parçalar, içinden seçim yaılarak sipariş oluşturulacak.

        Troschuetz.Random.DiscreteUniformDistribution gunlukRnd = new Troschuetz.Random.DiscreteUniformDistribution();
        Troschuetz.Random.DiscreteUniformDistribution sipAdetRnd = new Troschuetz.Random.DiscreteUniformDistribution();
        Random rndAralik = new Random();
        Random rndParca = new Random();



        public List<Siparis> Uret(Tarih AnaTarihler, AralikSaat GunlukTarih, List<Rota.RotaParcasi> Parcalar)
        {
            List<Siparis> liste = new List<Siparis>();
            //Istenme zamanı gün biçiminde
            for (DateTime date = AnaTarihler.BaslangicTarihi; date <= AnaTarihler.BitisTarihi; date = date.AddDays(1))
            {

                if (date.DayOfWeek == DayOfWeek.Sunday || date.DayOfWeek == DayOfWeek.Saturday)
                {
                    //Tatil günü
                }
                else
                {

                    //Troschuetz.Random.DiscreteUniformDistribution gunlukRnd = new Troschuetz.Random.DiscreteUniformDistribution();
                    gunlukRnd.Beta = GunlukSiparisSayisi.Max;
                    gunlukRnd.Alpha = GunlukSiparisSayisi.Min;
                    Troschuetz.Random.DiscreteUniformDistribution sipTeslimRnd = new Troschuetz.Random.DiscreteUniformDistribution();
                    for (int i = 0; i < gunlukRnd.Next(); i++)
                    {
                        //Troschuetz.Random.DiscreteUniformDistribution sipAdetRnd = new Troschuetz.Random.DiscreteUniformDistribution();
                        
                        sipAdetRnd.Beta = SiparisBuyuklugu.Max;
                        sipAdetRnd.Alpha = SiparisBuyuklugu.Min;

                        //Random rndAralik = new Random();
                        int rndGelis = rndAralik.Next(GunlukTarih.Aralik());

                        DateTime GelisZamani = date.Add(TimeSpan.FromMinutes(rndGelis));
                        

                        //Random rndParca = new Random();
                        int sayiParca = rndParca.Next(0,Parcalar.Count-1);
                        Rota.RotaParcasi  secilenParca = Parcalar[sayiParca];

                        //Troschuetz.Random.DiscreteUniformDistribution sipTeslimRnd = new Troschuetz.Random.DiscreteUniformDistribution();
                        sipTeslimRnd.Beta = SiparisTeslimSuresi.Max;
                        sipTeslimRnd.Alpha = SiparisTeslimSuresi.Min;
                        

                        DateTime TeslimTarihi = GelisZamani.AddDays(sipTeslimRnd.Next());
                        TeslimTarihi = TeslimTarihi.ChangeTime(17, 30, 0, 0);

                        while (TeslimTarihi.DayOfWeek==DayOfWeek.Saturday||TeslimTarihi.DayOfWeek==DayOfWeek.Sunday)
                        {
                            TeslimTarihi = GelisZamani.AddDays(sipTeslimRnd.Next());
                            TeslimTarihi = TeslimTarihi.ChangeTime(17, 30, 0, 0);
                        }

                        Tarih tarihler = new Tarih();
                        tarihler.BaslangicTarihi=GelisZamani;
                        tarihler.BitisTarihi = TeslimTarihi;


                        Siparis yeniSiparis = new Siparis(SiparisNo, secilenParca, sipAdetRnd.Next(), tarihler);
                        liste.Add(yeniSiparis);
                    }
                }
            }
            return liste;
        }

        

    }
}
